/**
 * 数组工具类
 */
export class ArrayUtil {

  /**
   * 判断数组是否为空
   * @returns 如果所有数组为null、undefined或长度为0则返回true，否则返回true
   * @param arrays 可变参数
   */
  static allEmpty<T>(...arrays: T[] | null | undefined): boolean {
    return arrays.every(arr => ArrayUtil.isEmpty(arr));
  }
  /**
   * 判断数组是否为空
   * @returns 如果存在任何数组为null、undefined或长度为0则返回true，否则返回true
   * @param arrays 可变参数
   */
  static anyEmpty<T>(...arrays: T[] | null | undefined): boolean {
    return arrays.some(arr => ArrayUtil.isEmpty(arr));
  }
    /**
     * 判断数组是否为空
     * @param arr 要检查的数组
     * @returns 如果数组为null、undefined或长度为0则返回true，否则返回false
     */
    static isEmpty<T>(arr: T[] | null | undefined): boolean {
        return !arr || arr.length === 0;
    }

    /**
     * 判断数组是否不为空
     * @param arr 要检查的数组
     * @returns 如果数组不为null、undefined且长度大于0则返回true，否则返回false
     */
    static isNotEmpty<T>(arr: T[] | null | undefined): boolean {
        return !this.isEmpty(arr);
    }

    /**
     * 安全获取数组
     * @param arr 源数组
     * @returns 如果数组为null或undefined则返回空数组，否则返回原数组
     */
    static safeGet<T>(arr: T[] | null | undefined): T[] {
        return arr || [];
    }

    /**
     * 获取数组第一个元素
     * @param arr 源数组
     * @returns 如果数组不为空返回第一个元素，否则返回undefined
     */
    static getFirst<T>(arr: T[] | null | undefined): T | undefined {
        return this.isEmpty(arr) ? undefined : arr![0];
    }

    /**
     * 获取数组最后一个元素
     * @param arr 源数组
     * @returns 如果数组不为空返回最后一个元素，否则返回undefined
     */
    static getLast<T>(arr: T[] | null | undefined): T | undefined {
        return this.isEmpty(arr) ? undefined : arr![arr!.length - 1];
    }

    /**
     * 获取指定范围的子数组
     * @param arr 源数组
     * @param start 起始索引，如果为负数则从末尾开始计算
     * @param end 结束索引（不包含），如果为负数则从末尾开始计算，如果省略则截取到末尾
     * @returns 返回指定范围的子数组，如果数组为空则返回空数组
     */
    static subArray<T>(arr: T[] | null | undefined, start: number, end?: number): T[] {
        if (this.isEmpty(arr)) {
            return [];
        }

        const safeArr = this.safeGet(arr);
        const len = safeArr.length;

        // 处理负数索引
        const actualStart = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);
        const actualEnd = end === undefined ? len :
                         end < 0 ? Math.max(len + end, 0) : Math.min(end, len);

        return safeArr.slice(actualStart, actualEnd);
    }
}
